[新機能] AWS WAFのレートベースルールでホワイトリストを利用してみた
ご機嫌いかがでしょうか、豊崎です。
AWS Blogで6月21日に発表されたAWS WAFの新しいレートベースルールでホワイトリストを利用した際の挙動をご紹介させていただきます。
レートベースルールについては弊社菊池も記事を書いていますので、あわせてご覧ください。
それでは早速試してみましょう。
試してみましょう
準備
チュートリアルではCloudFrontを利用していましたが、本記事ではALBにWAFを適用します。 WAFの設定を行う前にALBとその配下にWEBサーバ、ホワイトリストに登録するサーバ、登録しないサーバも用意しておきます。
- ALB
- ALB配下のWEBサーバ
- テスト用サーバA:ホワイトリストに登録している:52.XXX.XXX.118
- テスト用サーバB:ホワイトリストに登録していない:13.XXX.XXX.57
- テストツールはabを使用
http://<albエンドポイント>/loginで接続できるテストページを用意しました。
設定
String match Condition
はじめに、String match Conditionをつくっていきます。
AWSマネジメントコンソールからWAF&Shieldダッシュボードを開き、 String matching>Create conditionを押して進みます。
次の画面ではリクエストのURIに「/login」が含まれていた時にマッチするフィルターを設定しています。
フィルターが追加されたことを確認して、Createを押します。
IP match condition(ホワイトリスト用)
次にIP match conditionをつくります。
IP address>Create conditionを押して進みます。
ホワイトリストに設定したいIPアドレス(ここでは52.XXX.XXX.118)を入力します。 /8,/16,/24,/32でしか設定できないのでご注意ください。
追加されていることを確認してCreateを押します。
Rules
次にRuleを作っていきましょう。
Rules>Create Ruleを押して進みます。
Rule typeをRate-based Ruleに変更し、Rate limitsを設定しましょう。 Rate limitsは5分間の合計の値になります。設定できる最小値が2000だったので、今回は2000に設定しました。
次にmatch Conditionで先ほど作成したConditionを以下のように設定してCreateを押します。
Web ACLs
最後にWeb ACLをつくります。
Web ACLs>Create web ACLを押して進みます。
WAFに紐づけたいリソース(CloudFrontまたは、ALB)を指定します。
Create Condtions画面では特に設定を行いません。 そのまま次に進んでください。
Create Rulesの画面で先ほど設定した「demo-Rule」を追加します。 ルールにマッチしなかった時のデフォルトの動作は許可、マッチした場合はレートに応じて拒否を行います。
次の画面で設定を確認し、作成しましょう。
テスト
AWS環境への負荷テスト・侵入テストを実施する際には事前の申請が必要となりますのでご注意ください。
2台のEC2からabを使ってELBに閾値を超えたリクエストを送り、 ホワイトリストに登録したEC2のグローバルIPがブラックリストに登録されないことを確認します。
同じタイミングで数回abコマンドを打ったところでホワイトリストに登録していないサーバ側で「Non-2xx responses」が帰ってきました。
テスト用サーバA:ホワイトリストに登録している:52.XXX.XXX.118
# curl inet-ip.info 52.XXX.XXX.118 # date Thu Jun 22 02:45:03 UTC 2017 # ab -n 3000 -c 1 http://demo-waf-XXXXXXXXXX.ap-northeast-1.elb.amazonaws.com/login ---中略--- Concurrency Level: 1 Time taken for tests: 8.798 seconds Complete requests: 3000 Failed requests: 0 Write errors: 0 Total transferred: 819000 bytes HTML transferred: 60000 bytes Requests per second: 340.98 [#/sec] (mean) Time per request: 2.933 [ms] (mean) Time per request: 2.933 [ms] (mean, across all concurrent requests) Transfer rate: 90.91 [Kbytes/sec] received
テスト用サーバB:ホワイトリストに登録していない:13.XXX.XXX.57
# curl inet-ip.info 13.XXX.XXX.57 # date Thu Jun 22 02:40:05 UTC 2017 # ab -n 3000 -c 1 http://demo-waf-XXXXXXXXXX.ap-northeast-1.elb.amazonaws.com/login ---中略--- Concurrency Level: 1 Time taken for tests: 19.578 seconds Complete requests: 3000 Failed requests: 0 Write errors: 0 Non-2xx responses: 3000 Total transferred: 846000 bytes HTML transferred: 402000 bytes Requests per second: 153.23 [#/sec] (mean) Time per request: 6.526 [ms] (mean) Time per request: 6.526 [ms] (mean, across all concurrent requests) Transfer rate: 42.20 [Kbytes/sec] received
AWSマネジメントコンソールからも「13.XXX.XXX.57」がブラックリストに登録されたことが確認できました。 もちろんホワイトリストに設定している「52.XXX.XXX.118」はブラックリストに登録されていませんでした。
まとめ
WAFのレートベースのルールでホワイトリストを試してみました。ブログでもある通り、特定IPからのリクエストについてはリミットなく接続させたいというケースに利用できると思います。レートベースのWAFの登場で利用の幅が広がりましたね。これからいろいろ触ってみたいと思います。